Note: For this to work you need the latest version of lcopt-dev from the disclosures
branch on github
from lcopt import *
model = LcoptModel(load=r"files\Example Model.lcopt") # Note: you can download 'Example Model.lcopt' from the files folder on github
Here's what the model looks like:
Using export_disclosure
with no arguments exports the unspecified model (all values 1)
(Note: folder_path
optionally chooses a folder to put the files in, otherwise they are saved to the working directory)
unspecified_file_name = model.export_disclosure(folder_path='files')
unspecified_file_name
'files\\Example_Model_unspecified.json'
Or you can specify a parameter set by its index:
ps0_file_name = model.export_disclosure(0, folder_path='files')
ps0_file_name
'files\\Example_Model_ps_0.json'
or its name:
ps1_file_name = model.export_disclosure('Milky tea', folder_path='files')
ps1_file_name
'files\\Example_Model_ps_Milky tea.json'
import json
from pprint import pprint
with open(unspecified_file_name, 'r') as j:
data = json.load(j)
pprint(data)
{'Ad': {'data': [[[0, 1], 1.0], [[1, 1], 1.0], [[2, 2], 1.0], [[3, 0], 1.0]], 'shape': [4, 3]}, 'Af': {'data': [[[1, 2], 1.0], [[2, 0], 1.0]], 'shape': [3, 3]}, 'Bf': {'data': [[[0, 1], 1.0]], 'shape': [1, 3]}, 'background flows': [{'brightway_id': ['Ecoinvent3_3_cutoff', 'b80c575f22df17a0fbc7b4ae11f65dd2'], 'ecoinvent_id': '832cb6db-89ea-45a8-878b-42a580a3e33e', 'ecoinvent_name': 'market for electricity, medium ' 'voltage', 'index': 0, 'location': 'SE', 'unit': 'kilowatt hour'}, {'brightway_id': ['Ecoinvent3_3_cutoff', '05013963d77778b2c11336e1448b1fe2'], 'ecoinvent_id': '08852717-6b16-426c-be3d-649b2e6381b1', 'ecoinvent_name': 'market for tap water', 'index': 1, 'location': 'Europe without Switzerland', 'unit': 'kilogram'}, {'brightway_id': ['Ecoinvent3_3_cutoff', '45996ff4d44c8a72ba5bf0ad89fbdb5e'], 'ecoinvent_id': '6aaf3f99-7e9c-45f9-9217-8afff755e9d9', 'ecoinvent_name': 'market for tea, dried', 'index': 2, 'location': 'GLO', 'unit': 'kilogram'}, {'brightway_id': ['Ecoinvent3_3_cutoff', '214da18debd3c0074df1c1996cf0fed4'], 'ecoinvent_id': '98c6a35d-80bb-4a23-b11e-68688a93b7b4', 'ecoinvent_name': 'market for cow milk', 'index': 3, 'location': 'GLO', 'unit': 'kilogram'}], 'foreground emissions': [{'biosphere3_id': ['biosphere3', '075e433b-4be4-448e-9510-9a5029c1ce94'], 'index': 0, 'name': 'Water, emission, air', 'unit': 'cubic meter'}], 'foreground flows': [{'index': 0, 'location': 'GLO', 'name': 'Tea', 'unit': 'l'}, {'index': 1, 'location': 'GLO', 'name': 'Boiling water', 'unit': 'l'}, {'index': 2, 'location': 'GLO', 'name': 'Black tea', 'unit': 'l'}]}
Here's what we're expecting:
import numpy as np
import pandas as pd
Write a helper function to reconstruct a matrix as a numpy array from the json data
def reconstruct_matrix(matrix_dict):
m = np.zeros(matrix_dict['shape'])
for (r, c), v in matrix_dict['data']:
m[r, c] = v
return m
Create pandas DataFrames for easy viewing of the resulting matrices
Af = pd.DataFrame(reconstruct_matrix(data['Af']), index=["({}) {}, {}".format(x['index'], x['name'], x['unit']) for x in data['foreground flows']])
Ad = pd.DataFrame(reconstruct_matrix(data['Ad']), index=["{} [{}], {}, ({}, {})".format(x['ecoinvent_name'], x['location'],x['unit'], *x['brightway_id']) for x in data['background flows']])
Bf = pd.DataFrame(reconstruct_matrix(data['Bf']), index=["{}, {}, ({}, {})".format(x['name'], x['unit'], *x['biosphere3_id']) for x in data['foreground emissions']])
Af
0 | 1 | 2 | |
---|---|---|---|
(0) Tea, l | 0.0 | 0.0 | 0.0 |
(1) Boiling water, l | 0.0 | 0.0 | 1.0 |
(2) Black tea, l | 1.0 | 0.0 | 0.0 |
Ad
0 | 1 | 2 | |
---|---|---|---|
market for electricity, medium voltage [SE], kilowatt hour, (Ecoinvent3_3_cutoff, b80c575f22df17a0fbc7b4ae11f65dd2) | 0.0 | 1.0 | 0.0 |
market for tap water [Europe without Switzerland], kilogram, (Ecoinvent3_3_cutoff, 05013963d77778b2c11336e1448b1fe2) | 0.0 | 1.0 | 0.0 |
market for tea, dried [GLO], kilogram, (Ecoinvent3_3_cutoff, 45996ff4d44c8a72ba5bf0ad89fbdb5e) | 0.0 | 0.0 | 1.0 |
market for cow milk [GLO], kilogram, (Ecoinvent3_3_cutoff, 214da18debd3c0074df1c1996cf0fed4) | 1.0 | 0.0 | 0.0 |
Bf
0 | 1 | 2 | |
---|---|---|---|
Water, emission, air, cubic meter, (biosphere3, 075e433b-4be4-448e-9510-9a5029c1ce94) | 0.0 | 1.0 | 0.0 |
If we want to recreate the results of an lcopt model we can do the same thing with one of the specified files
with open(ps1_file_name, 'r') as j:
specified_data = json.load(j)
Af_ps1 = pd.DataFrame(reconstruct_matrix(specified_data['Af']), index=["({}) {}, {}".format(x['index'], x['name'], x['unit']) for x in specified_data['foreground flows']])
Ad_ps1 = pd.DataFrame(reconstruct_matrix(specified_data['Ad']), index=["{} [{}], {}, ({}, {})".format(x['ecoinvent_name'], x['location'],x['unit'], *x['brightway_id']) for x in specified_data['background flows']])
Bf_ps1 = pd.DataFrame(reconstruct_matrix(specified_data['Bf']), index=["{}, {}, ({}, {})".format(x['name'], x['unit'], *x['biosphere3_id']) for x in specified_data['foreground emissions']])
Af_ps1
0 | 1 | 2 | |
---|---|---|---|
(0) Tea, l | 0.00 | 0.0 | 0.0 |
(1) Boiling water, l | 0.00 | 0.0 | 1.0 |
(2) Black tea, l | 0.99 | 0.0 | 0.0 |
Ad_ps1
0 | 1 | 2 | |
---|---|---|---|
market for electricity, medium voltage [SE], kilowatt hour, (Ecoinvent3_3_cutoff, b80c575f22df17a0fbc7b4ae11f65dd2) | 0.00 | 0.075 | 0.000 |
market for tap water [Europe without Switzerland], kilogram, (Ecoinvent3_3_cutoff, 05013963d77778b2c11336e1448b1fe2) | 0.00 | 1.000 | 0.000 |
market for tea, dried [GLO], kilogram, (Ecoinvent3_3_cutoff, 45996ff4d44c8a72ba5bf0ad89fbdb5e) | 0.00 | 0.000 | 0.012 |
market for cow milk [GLO], kilogram, (Ecoinvent3_3_cutoff, 214da18debd3c0074df1c1996cf0fed4) | 0.01 | 0.000 | 0.000 |
Bf_ps1
0 | 1 | 2 | |
---|---|---|---|
Water, emission, air, cubic meter, (biosphere3, 075e433b-4be4-448e-9510-9a5029c1ce94) | 0.0 | 0.00001 | 0.0 |
This should be all the information we need to recreate the structure of the original foreground model, with the correct links to the background and biosphere databases